package hyy_2022;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 使用两个队列实现一个后入先出的栈
 */
public class _0810_225_Stack {

    Queue<Integer> queue1;
    Queue<Integer> queue2;

    public _0810_225_Stack() {
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }

    /**
     * 1、queue1用于存储栈内元素,queue2作为入栈操作的辅助队列
     * 2、入栈操作时,首先将元素入queue2,然后将queue1的全部元素依次出队并入队列queue2,此时queue2的前端的元素即为新入栈的元素
     * 3、将queue1 和 queue2 互换,则queue1 的元素即为栈内的元素, queue1的前端和后端分别对应栈顶和栈底
     * 备注：offer方法优于add
     */
    public void push(int x) {
        queue2.offer(x);
        while(!queue1.isEmpty()) {
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }

    public int pop() {
        return queue1.poll();
    }

    public int top() {
        return queue1.peek();
    }

    public boolean empty() {
        return queue1.isEmpty();
    }
}
